/**
 * @author zhanghuihua@msn.com
 */

(function($) {
	var menu, shadow, hash;
	$.fn.extend({
				contextMenu : function(id, options) {
					var op = $.extend({
								shadow : true,
								bindings : {},
								ctrSub : null
							}, options);

					if (!menu) {
						menu = $('<div id="contextmenu"></div>')
								.appendTo('body').hide();
					}
					if (!shadow) {
						shadow = $('<div id="contextmenuShadow"></div>')
								.appendTo('body').hide();
					}

					hash = hash || [];
					hash.push({
								id : id,
								shadow : op.shadow,
								bindings : op.bindings || {},
								ctrSub : op.ctrSub
							});

					var index = hash.length - 1;
					$(this).bind('contextmenu', function(e) {
								display(index, this, e, op);
								return false;
							});
					return this;
				}
			});

	function display(index, trigger, e, options) {
		var cur = hash[index];

		var content = $(DWZ.frag[cur.id]);
		content.find('li').hoverClass();

		// Send the content to the menu
		menu.html(content);

		$.each(cur.bindings, function(id, func) {
					$("[rel='" + id + "']", menu).bind('click', function(e) {
								hide();
								func($(trigger), $("#" + cur.id));
							});
				});

		var posX = e.pageX;
		var posY = e.pageY;
		if ($(window).width() < posX + menu.width())
			posX -= menu.width();
		if ($(window).height() < posY + menu.height())
			posY -= menu.height();

		menu.css({
					'left' : posX,
					'top' : posY
				}).show();
		if (cur.shadow)
			shadow.css({
						width : menu.width(),
						height : menu.height(),
						left : posX + 3,
						top : posY + 3
					}).show();
		$(document).one('click', hide);

		if ($.isFunction(cur.ctrSub)) {
			cur.ctrSub($(trigger), $("#" + cur.id));
		}
	}

	function hide() {
		menu.hide();
		shadow.hide();
	}
})(jQuery);
